package com.neu.beautydemo.view;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.hardware.Camera.Size;
import android.util.AttributeSet;
import android.util.Log;

import org.opencv.android.JavaCameraView;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.util.List;

public class Tutorial3View extends JavaCameraView implements PictureCallback {

    private static final String TAG = "Sample::Tutorial3View";
    private String mPictureFileName;

    public Tutorial3View(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public List<String> getEffectList() {
        return mCamera.getParameters().getSupportedColorEffects();
    }

    public boolean isEffectSupported() {
        return (mCamera.getParameters().getColorEffect() != null);
    }

    public String getEffect() {
        return mCamera.getParameters().getColorEffect();
    }

    public void setEffect(String effect) {
        Camera.Parameters params = mCamera.getParameters();
        params.setColorEffect(effect);
        mCamera.setParameters(params);
    }
    public void setCameraOrientation(int i) {
        Camera.Parameters params = mCamera.getParameters();
        params.set("rotation",i);
        mCamera.setParameters(params);
    }

    public List<Size> getResolutionList() {
        return mCamera.getParameters().getSupportedPreviewSizes();
    }

    public void setResolution(Size resolution) {
        disconnectCamera();
        mMaxHeight = resolution.height;
        mMaxWidth = resolution.width;
        connectCamera(getWidth(), getHeight());
    }

    public Size getResolution() {
        return mCamera.getParameters().getPreviewSize();
    }

    public void takePicture(final String fileName) {
        Log.i(TAG, "Taking picture");
        this.mPictureFileName = fileName;
        // Postview and jpeg are sent in the same buffers if the queue is not empty when performing a capture.
        // Clear up buffers to avoid mCamera.takePicture to be stuck because of a memory issue
        mCamera.setPreviewCallback(null);

        // PictureCallback is implemented by the current class
        mCamera.takePicture(null, null, this);
    }

//    @Override
//    public void onPictureTaken(byte[] data, Camera camera) {
//        Log.i(TAG, "Saving a bitmap to file");
//        // The camera preview was automatically stopped. Start it again.
//        mCamera.startPreview();
//        mCamera.setPreviewCallback(this);
//
//        // Write the image in a file (in jpeg format)
//        try {
//            FileOutputStream fos = new FileOutputStream(mPictureFileName);
//
//            fos.write(data);
//            fos.close();
//
//        } catch (java.io.IOException e) {
//            Log.e("PictureDemo", "Exception in photoCallback", e);
//        }
//
//    }

    public static Bitmap bm;
    @Override
    public void onPictureTaken(byte[] data, Camera camera) {
// TODO Auto-generated method stub
        mCamera.startPreview();
        mCamera.setPreviewCallback(this);
        try{
            bm = BitmapFactory.decodeByteArray(data, 0, data.length);

            int w = bm.getWidth();
            int h = bm.getHeight();
            Matrix matrix = new Matrix();
            matrix.postScale(-1, 1); // 镜像水平翻转
            bm = Bitmap.createBitmap(bm, 0, 0, w, h, matrix, true);

            File file = new File(mPictureFileName);
            BufferedOutputStream bos= new BufferedOutputStream(new FileOutputStream(file));
            bm.compress(Bitmap.CompressFormat.PNG,100,bos);
            bos.flush();
            bos.close();
        }catch(Exception e){
            e.printStackTrace();
        }
    }

}
